#include <iostream>
#include <vector>
#include <string>
using namespace std;

//class Solution {
//public:
//    string minWindow(string s, string t) {
//        int n1 = s.size();
//        int n2 = t.size();
//        string ret;
//        if (n2 > n1)
//        {
//            return ret;
//        }
//        int arr1[100] = { 0 };
//        int arr2[100] = { 0 };
//        for (int i = 0; i < n2; i++)
//        {
//            arr2[t[i] - 'A']++;
//        }
//        int my_min = -1;
//        int len = INT_MAX;
//        int left = 0;
//        int right = 0;
//        int count = 0;
//        while (right < n1)
//        {
//            arr1[s[right] - 'A']++;
//            if (arr1[s[right] - 'A'] <= arr2[s[right] - 'A'])
//            {
//                count++;
//            }
//            while (count == n2)
//            {
//                if (right - left + 1 < len)
//                {
//                    len = right - left + 1;
//                    my_min = left;
//                }
//                arr1[s[left] - 'A']--;
//                if (arr1[s[left] - 'A'] < arr2[s[left] - 'A'])
//                {
//                    count--;
//                }
//                left++;
//            }
//            right++;
//        }
//        if (my_min == -1)
//        {
//            return ret;
//        }
//        for (int i = my_min; i < my_min + len; i++)
//        {
//            ret += s[i];
//        }
//        return ret;
//    }
//};
//
//class Solution {
//public:
//    vector<int> searchRange(vector<int>& nums, int target) {
//        vector<int> ret;
//        int n = nums.size();
//        if (n == 0)
//        {
//            ret.push_back(-1);
//            ret.push_back(-1);
//            return ret;
//        }
//        int left = 0;
//        int right = n - 1;
//        while (left < right)
//        {
//            int mid = (left + right) / 2;
//            if (nums[mid] >= target)
//            {
//                right = mid;
//            }
//            else
//            {
//                left = mid + 1;
//            }
//        }
//        if (nums[left] != target)
//        {
//            ret.push_back(-1);
//            ret.push_back(-1);
//            return ret;
//        }
//        else
//        {
//            ret.push_back(left);
//        }
//        right = n - 1;
//        while (left < right)
//        {
//            int mid = (left + right + 1) / 2;
//            if (nums[mid] > target)
//            {
//                right = mid - 1;
//            }
//            else
//            {
//                left = mid;
//            }
//        }
//        ret.push_back(left);
//        return ret;
//    }
//};

class Solution {
public:
    int mySqrt(int x) {
        if (x == 0 || x == 1)
        {
            return x;
        }
        int left = 0;
        int right = x;
        while (left < right)
        {
            int mid = (right + left) / 2;
            if ((long long)mid * mid <= x)
            {
                left = mid + 1;
            }
            else if ((long long)mid * mid > x)
            {
                right = mid - 1;
            }
            else
            {
                return mid;
            }
        }
        if ((long long)left * left > x)
        {
            return left - 1;
        }
        return left;
    }
};

class Solution {
public:
    int searchInsert(vector<int>& nums, int target)
    {
        size_t n = size(nums);
        int left = 0;
        int right = n - 1;
        while (left < right)
        {
            int mid = (left + right) / 2;
            if (nums[mid] >= target)
            {
                right = mid;
            }
            else
            {
                left = mid + 1;
            }
        }
        if (nums[left] < target)
        {
            return left + 1;
        }
        return left;
    }
};

class Solution {
public:
    int maximum69Number(int num) {
        string s = to_string(num);
        int n = s.size();
        for (int i = 0; i < n; i++)
        {
            char s2 = s[i];
            if (s2 == '6')
            {
                s[i] = '9';
                break;
            }
        }
        return atoi(s.c_str());
    }
};

int main()
{
    Solution s;
    cout << s.mySqrt(8) << endl;
    return 0;
}